package com.yk._09线程池;

import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * 最大线程到底如何定义
 *  1.CPU密集型  CPU线程数多少就设置多少
 *  2.IO密集型 判断你的程序中十分耗IO的线程，一般大于15个线程，实际中可以设置两倍
 */
public class _02ThreadPool {
    public static void main(String[] args) {
        System.out.println();
        //不推荐使用工具类创建线程池，因为工具类的最大线程数 往往不符合实际业务需求(可能发生OOM)
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2,//核心线程数
                Runtime.getRuntime().availableProcessors(),//最大线程数
                10,//多余线程(核心线程数以外)保活时间
                TimeUnit.SECONDS,//时间单位
                new LinkedBlockingQueue<>(3),//任务队列
                Executors.defaultThreadFactory(),//线程工厂
                new ThreadPoolExecutor.AbortPolicy());//拒绝策略
//
//        1. CallerRunsPolicy ：这个策略重试添加当前的任务，他会自动重复调用 execute() 方法，直到成功。
//
//        2. AbortPolicy ：对拒绝任务抛弃处理，并且抛出异常。
//
//        3. DiscardPolicy ：对拒绝任务直接无声抛弃，没有异常信息。
//
//        4. DiscardOldestPolicy ：对拒绝任务不抛弃，而是抛弃队列里面等待最久的一个线程，然后把拒绝任务加到队列。


        for (int i = 0; i < 10; i++) {
            int temp = i+1;
            threadPoolExecutor.execute(()->{
                try {
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + "====> 正在执行" + temp);
            });
        }

        threadPoolExecutor.shutdown();
    }
}